package com.mk.seckill.exception;

import com.mk.seckill.vo.RespBean;
import com.mk.seckill.vo.RespBeanEnum;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice// @RestController注解的类方法返回的就是字符串类型，省略方法上的@ResponseBody注解
// @ControllerAdvice注解是用来捕获异常的
public class GlobalExceptionHandler {
	/**
	 * @Author hhwu
	 * @Description //TODO 全局异常处理类，会自动实时监控项目中所有的异常抛出，如果有异常抛出，则该类自动处理。
	 * TODO 处理方式是，根据异常种类，返回一个对应的字符串类型的异常实体，显示在页面
	 * @Date 9:26 2022/6/7
	 **/

	@ExceptionHandler(Exception.class)// 括号中指定需要处理的异常类，这里指定为java中的所有异常类，当然也就包括自定义的异常
	public RespBean ExceptionHandler(Exception e) {
		/**
		 * @Author hhwu
		 * @Description //TODO 这个方法处理异常，会自动返回一个JSON格式的字符串（由respBean对象转化而来），前端界面捕获到此字符串，会处理后展示
		 * TODO 在页面中
		 * @Date 10:03 2022/6/7
		 * @Param [e]
		 * @return com.xxxx.seckill.vo.RespBean
		 **/
		if (e instanceof GlobalException) {// 处理类自定义异常
			GlobalException ex = (GlobalException) e;
			return RespBean.error(ex.getRespBeanEnum());
		} else if (e instanceof BindException) {
			BindException ex = (BindException) e;
			RespBean respBean = RespBean.error(RespBeanEnum.BIND_ERROR);
			respBean.setMessage("参数校验异常：" + ex.getBindingResult().getAllErrors().get(0).getDefaultMessage());
			return respBean;
		}
		return RespBean.error(RespBeanEnum.ERROR);
	}

}